import puppeteer, {Page} from 'puppeteer'

(async () => {
  // 启动浏览器（默认无头模式）
  const browser = await puppeteer.launch({
    headless: false, // 调试时可设为 false 显示界面
    defaultViewport: null,
    // args: ['--no-sandbox', '--disable-setuid-sandbox'] // 服务器环境需要
    args: ['--start-maximized']
  })
  const page = await browser.newPage()

  await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36')

  // 导航到页面并截图
  await page.goto('https://show.bilibili.com/platform/detail.html?id=101142&from=pc_ticketlist')
  // await page.screenshot({ path: 'screenshot.png' })
  await page.click('.nav-header-register')

  // 等待该元素可见
  await page.waitForSelector(".bili-mini-tab-message", { visible: true })

  await page.click('.bili-mini-tab-message')
  // 输入文本
  await page.type('.tel-input', '1550211****', { delay: 100 }); // 模拟人工输入
  // 输入文本
  // await page.type('.bili-mini-code >input', '375459', { delay: 100 }); // 模拟人工输入

  // 方案一：轮询检测输入框内容变化（每 1 秒检查一次）
  await waitForInput(page, '.bili-mini-code >input', 300000); // 300000ms = 5分钟

  // 方案二：直接等待用户操作（注释掉上方代码，启用下方代码）
  // await page.waitForFunction(
  //   (selector) => document.querySelector(selector).value.length > 0,
  //   { timeout: 300000 },
  //   captchaSelector
  // );

  await page.click('.login-btn')

  // await page.waitForSelector(".product-buy >div", { visible: true })
  await page.waitForNavigation({ timeout: 10000 })
  await page.click('.product-buy >div')

})()

/**
 * 自定义等待输入函数（轮询检测）
 * @param page
 * @param {string} selector - 输入框选择器
 * @param {number} timeout - 超时时间（毫秒）
 */
async function waitForInput(page: Page, selector: string, timeout: number) {
  const startTime = Date.now();
  while (Date.now() - startTime < timeout) {
    // @ts-ignore
    const inputValue = await page.$eval(selector, el => el.value);
    if (inputValue && inputValue.trim().length >= 6) { // 假设验证码至少4位
      return true;
    }
    await setTimeout(() => {}, 1000); // 每秒检查一次
  }
  throw new Error(`等待验证码输入超时（${timeout}ms）`);
}